iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
1
Software Development

Unity遊戲開發與實踐-BlueRemedy內容分享系列 第 6

[Day6] 主角-基本操作(移動篇)

  • 分享至 

  • xImage
  •  

前五天的內容介紹BlueRemedy這款遊戲的完整內容。第六天開始,將循序漸進介紹程式製作過程的內容、以及如何製作出各種特殊機制。

題外話

我總認為,程式開發就是不斷滿足企劃的天馬行空。

每次開會,聽著組員討論著他們想像中希望有的功能,身為程式的我邊聽邊覺得害怕...他們口中的一個簡單功能可能得多弄個兩三天啊!

但想想或許這也是件好事,這代表我們的遊戲會有更豐富的內容
(如果讓我負責發想,可能會優先考量製作時間與成效的CP值而取消許多機制吧)


進入正題

每個遊戲的第一步都是設定主角的操作,我打算用兩天篇幅紀錄基礎操作的程式(硬要塞在一天會太長),今天的內容會包含主角Oka的移動、跳躍,而明天還有一項比較特別的機制"蹬牆跳"。

編寫程式前,先為我們的腳色Oka設定Rigidbody元件及Collider碰撞器。因為Oka基本上就是個圓形圖案所以我選擇以CircleCollider元件做設定。要注意的是,因為這是2D遊戲,也沒有特殊需求,所以加入元件時要特別選擇2D專用的元件。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414rQQojpOHEZ.jpg

設定最基本的左右移動

左右移動的程式,網路資料大致分成兩種寫法:其一是設定腳色的transform.position值,第二種方法則是取的腳色的Rigidbody元件並設定velocity值,我習慣以第二種方式控制腳色移動。

Step1:

首先在Player物件上加入PlayerControl腳本,

Step2:

宣告以下變數

  • float moveSpeed,預設值為8f,用來控制移動速度。
  • bool facingRight,判斷腳色面向,會用來設定腳色移動時圖像的左右翻轉。
  • Rigidbody2D變數rb2d,並在Start中將這個變數連結至Player身上的元件。
    https://ithelp.ithome.com.tw/upload/images/20200913/20130414SRZ0BKibpf.jpg

因為我們的Oka有三種變身,所以需要再設定一個整數變數 OkaID_Now,用來記錄現在的型態(之後才會用到)。0代表固態、1代表液態、2代表氣態,這組變數在許多腳本中都會使用到,所以我打算將它設為公開的靜態變數。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414KqCOGypZqH.jpg

Step3:

接下來創建Move函式(我習慣把功能用函式包起來,方便之後修改及Debug),接著在FixedUpdate中呼叫Move函式。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414qhfOBok2pL.jpg

之所以使用FixedUpdate函式的原因而非Update,主要是因為Update呼叫頻率會依據每偵更新速度而有所不一,如果將移動功能放在Update裡面會感受到奇怪的停頓。而FixedUpdate的呼叫頻率會較為統一(內部原理我也不清楚),因此有關移動的程式建議都放在FixedUpdate中。

Step4:

Move函式要做的事情很簡單,偵測鍵盤或搖桿的水平輸入,這個值會介於-1~1之間,乘上前面設定的moveSpeed變數,再把這個值設定為rb2d的velocity值即可。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414pKAGk07oLI.jpg

動畫animator操作設定:

Step1:

主角Player物件底下有三個子物件,分別控制是個型態的外型圖示動畫。現在要在PlayerControl腳本內宣告一格Animator陣列並連結到三個子物件身上的Animator元件。
https://ithelp.ithome.com.tw/upload/images/20200913/201304145NZUlbAxwm.jpg

Step2:

透過animator[OkaID_Now].SetFloat("xSpeed", Mathf.Abs(rb2d.velocity.x)) 可以設定目前型態animator中的參數設定為目前速度。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414MUTgPG82XX.jpg

Animator中目前有兩個動畫IDLE、RUN,當速度>0時就會切為RUN,反則切回IDLE。看途中圈起來部分就好,其他內容之後會再做介紹。至於Animator網路上有很多教學了,這邊就不再多說。
https://ithelp.ithome.com.tw/upload/images/20200913/201304145niTKNFnBt.jpg

左右翻轉

喔!差點忘了一個重要功能,因為目前Oka圖是面向右的,當他往左邊走時總不能像是倒退嚕吧!要寫個函是讓他在向左時左右翻轉,聽起來很難? 其實只是scale.x乘上負號啦。

Step1:

這時候前面寫的facingRight就派上用場啦,當X軸輸入不為零時,假如我按右邊但現在正面向左,或是我按左但正面向右邊時,就會呼叫Flip函式做x軸左右相反。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414hsWjf9Zq83.jpg

Step2:

至於翻轉Flip函式則是這樣,簡單說就是把Scale乘以-1,並把facingRight的值true/false對調而已。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414pbTQITGgu1.jpg


好了,最基本的移動完成,明天將挑戰跳躍!


上一篇
[Day5]企劃-機制設定、遊戲流程
下一篇
[Day7] 主角-基本操作(跳躍篇)
系列文
Unity遊戲開發與實踐-BlueRemedy內容分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言